package com.pawelthiel.persistence.dao.implementation;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.PersistenceException;
import javax.persistence.Query;

import com.framework.persistence.jpa.AbstractGenericJpaDAO;
import com.framework.services.ServiceFacade;
import com.pawelthiel.persistence.dao.IDataAccessObject;
import com.pawelthiel.persistence.entity.AbstractEntity;
import com.pawelthiel.persistence.entity.Antwort;
import com.pawelthiel.persistence.entity.Antwortbogen;
import com.pawelthiel.persistence.entity.Teilnehmer;
import com.pawelthiel.persistence.entity.Umfrage;
import com.pawelthiel.persistence.mapper.EntityToTransferObjectMapper;
import com.pawelthiel.persistence.mapper.TransferObjectToEntityMapper;
import com.pawelthiel.persistence.to.AbstractTO;
import com.pawelthiel.persistence.to.AntwortTO;
import com.pawelthiel.persistence.to.AntwortbogenTO;
import com.pawelthiel.persistence.to.FrageTO;
import com.pawelthiel.persistence.to.TeilnehmerTO;
import com.pawelthiel.persistence.to.UmfrageTO;

public class AntwortDAO extends AbstractGenericJpaDAO<Antwort, Integer> implements IDataAccessObject<AntwortTO> {

	@Override
	public AbstractTO select(int pk) throws PersistenceException, com.framework.exceptions.PersistenceException {
		Antwort antwort = findByPrimaryKey(pk);
		AntwortTO antwortTO = EntityToTransferObjectMapper.mapAntwort(antwort);
		return antwortTO;
	}

	@Override
	public AntwortTO findByFilter(int key) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public AntwortTO findByFilter(String key) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Integer getPrimaryKey(AbstractEntity entity) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<AntwortTO> selectAll() {
		List<AntwortTO> antworten = new ArrayList<AntwortTO>();
		Query query = createNativeQuery("select a from Antwort a");
		List<Antwort> resultList = query.getResultList();
		
		for(Antwort antwort : resultList) {
			AntwortTO antwortTO = EntityToTransferObjectMapper.mapAntwort(antwort);
			antworten.add(antwortTO);
		}
		return antworten;
	}

	@Override
	public void insert(AbstractTO to)
			throws com.framework.exceptions.PersistenceException {
		AntwortTO antwortTO = (AntwortTO) to;
		UmfrageTO umfrageTO = new UmfrageTO();
		List<AntwortbogenTO> antwortbogenTOs = new ArrayList<AntwortbogenTO>();
		FrageTO frageTO = new FrageTO();
		
		Antwort antwort = new Antwort();
		Umfrage umfrage = new Umfrage();
		List<Antwortbogen> antwortbogens = new ArrayList<Antwortbogen>();
		
		// ====================================================================================================================================
		
		if(antwortTO.getUmfrage() != null) {
//			IDataAccessObject<UmfrageTO> dao = ServiceFacade.getService(IDataAccessObject.class, umfrageTO);
			IDataAccessObject<UmfrageTO> dao = new UmfrageDAO();
			umfrageTO = dao.findByFilter(antwortTO.getUmfrage().getId());
		}
		
		if(antwortTO.getFrage() != null) {
//			IDataAccessObject<FrageTO> daoFrage = ServiceFacade.getService(IDataAccessObject.class, frageTO);
			IDataAccessObject<FrageTO> daoFrage = new FrageDAO();
			frageTO = daoFrage.findByFilter(antwortTO.getFrage().getId());
		}
		
		if(umfrageTO.getAntwortbogen() != null || umfrageTO.getAntwortbogen().size() > 0) {
			antwortbogenTOs = umfrageTO.getAntwortbogen();
			
			for(AntwortbogenTO element : antwortbogenTOs) {
				Antwortbogen antwortbogen = new Antwortbogen();
				Teilnehmer teilnehmer = new Teilnehmer();
				
//				IDataAccessObject<AntwortbogenTO> daoAWBogen = ServiceFacade.getService(IDataAccessObject.class, element);
				IDataAccessObject<AntwortbogenTO> daoAWBogen = new AntwortBogenDAO();
				AntwortbogenTO antwortbogenTO = daoAWBogen.findByFilter(element.getId());
				
				TransferObjectToEntityMapper.mapAntwortbogen(antwortbogen, antwortbogenTO);
				
				antwortbogen.setUmfrage(umfrage);
				
//				IDataAccessObject<TeilnehmerTO> daoTeilnehmer = ServiceFacade.getService(IDataAccessObject.class, "TeilnehmerTO");
				IDataAccessObject<TeilnehmerTO> daoTeilnehmer = new TeilnehmerDAO();
				TeilnehmerTO teilnehmerTO = daoTeilnehmer.findByFilter(antwortbogenTO.getTeilnehmer().getId());
				
				TransferObjectToEntityMapper.mapTeilnehmer(teilnehmer, teilnehmerTO);
				
				teilnehmer.setAntwortbogens(antwortbogens);
				
				antwortbogens.add(antwortbogen);
			}
		}
		
		// ====================================================================================================================================
		TransferObjectToEntityMapper.mapAntwort(antwort, antwortTO);
		TransferObjectToEntityMapper.mapUmfrage(umfrage, umfrageTO);
		// ====================================================================================================================================		
		save(antwort);		
	}

	@Override
	public void update(AbstractTO to)
			throws com.framework.exceptions.PersistenceException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void delete(AbstractTO to)
			throws com.framework.exceptions.PersistenceException {
		// TODO Auto-generated method stub
		
	}

}
